/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.marcelo.agro.core;

import java.util.prefs.PreferenceChangeEvent;
import java.util.prefs.PreferenceChangeListener;
import java.util.prefs.Preferences;
import org.marcelo.agro.constantes.IConstantes;
import org.marcelo.agro.core.api.ILotes;
import org.marcelo.agro.entidades.UnidadMedidaSuperficie;
import org.openide.util.Lookup;
import org.openide.util.NbPreferences;
import org.openide.windows.IOProvider;
import org.openide.windows.InputOutput;
import org.openide.windows.OutputWriter;

/**
 *
 * @author marcelo
 * Clase para manejar todas las variables globales de la aplicacion
 * Aqui se si la aplicacion esta en modo desarrollo
 * Cuales son los formatos por defecto
 * 
 * Debe estar la unidad de Medida de superficie preferida
 */
public class GlobalContext {
    
    private static String KEY_UNIDAD_MEDIDA_SUPERFICIE_PREFERIDA = IConstantes.PREF_keyUnidadMedidaSuperficie;
    private static String TITULO_VENTANA = "LOGGUER AGROBOOK";
    private static GlobalContext instance = null;
    
    private Boolean MODO_DESARROLLO = Boolean.TRUE;
    private Logger logger;
    private UnidadMedidaSuperficie umsPref;
    private Preferences nodo = NbPreferences.root();
    //para poder reconocer los cambios en las preferencias
    PreferenceChangeListener pcl = new PreferenceChangeListener() {

        @Override
        public void preferenceChange(PreferenceChangeEvent pce) {
           //Aca es donde debe actar mi cambio
        }
    };
    
    public static GlobalContext getInstance(){
        if (instance==null){
            instance = new GlobalContext();
        }
        return instance;
    }

    private GlobalContext() {
        logger = new Logger(IOProvider.getDefault().getIO(TITULO_VENTANA, false));
        //Iniciar la umsPref
         
        nodo.addPreferenceChangeListener(pcl);
    }
    
    
    
    
    
    /**
     * Metodo para determinar en que modo de operacion esta el sistema
     */
    public Boolean isModoDesarrollo(){
        return MODO_DESARROLLO;
    }
    
    /**
     * Retorna el Logger de la aplicacion para mostrar mensajes en la ventana de IO
     * @return una instancia de <strong>Logger</strong>
     */
    public Logger Logger() {
        return logger;
    }
    
    
    
    /**
     * Metodo para obtener la unidad de medida de superficie preferida en el sistema
     */
    public UnidadMedidaSuperficie getUnidadMedidaPreferida(){
        if (umsPref == null){
            String superficiePreferidaId = nodo.get(KEY_UNIDAD_MEDIDA_SUPERFICIE_PREFERIDA, "1");
            ILotes il = Lookup.getDefault().lookup(ILotes.class);
            umsPref = il.getUnidadSuperficieById(Integer.parseInt(superficiePreferidaId));
        }
        return umsPref;
    } 
    
    /**
     * La intencion de esta clase es la de permitir que se puedan realizar los prin 
     * en la ventana de IO del netbeans, entonces en cada codigo puedo hacer esto, para debung
     * y tambien puedo controlar el hecho de mostrar o no a travez del parametro
     * isModoDesarrollo
     */
    public class Logger {
        
        private InputOutput  io;

        public Logger(InputOutput io) {
            this.io = io;
        }
    
        public void println(Object mensaje){
            if (isModoDesarrollo())
                io.getOut().println(mensaje);
        }
        
        
        
        public void printError(Object mensajeError) {
            if (isModoDesarrollo())
                io.getErr().println(mensajeError);
        }

        public OutputWriter getOut() {
            return io.getOut();
        }
        
        
    }
}
